from flask import Flask

from flask_sqlalchemy import SQLAlchemy

from sqlalchemy import or_, and_, not_

app = Flask(__name__)

app.config.from_pyfile("config.py")

db = SQLAlchemy(app)  # 生成db 连接对象


# 创建一个类 来描述数据表

class Book(db.Model):
    __tablename__ = "books"  # 标识数据表的名称

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, nullable=False)
    author = db.Column(db.String(20), nullable=True)  # 可以为空


class Type(db.Model):  # 继承 Model 至关重要
    __tablename__ = "types"  # 标识数据表的名称

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, nullable=False)


@app.route("/init")
def init():
    # 初始化数据表
    db.create_all()  # 完成所有的表的创建
    return "初始化数据表"


@app.route("/drop")
def drop():
    db.drop_all()
    return "删除所有数据表"


@app.route("/add")
def add():
    # 给 分类 添加数据   单个添加
    # type1 = Type(name="历史小说")
    # type2 = Type(name="武侠小说")
    #
    # # 写入数据库
    # db.session.add(type1)  # 数据库连接会话对象  完成添加操作
    # db.session.add(type2)
    # db.session.commit()  # 要提交

    type3 = Type(name="玄幻小说")
    type4 = Type(name="修仙小说")
    type5 = Type(name="鬼怪小说")

    # 批量添加  add_all
    db.session.add_all([type3, type4, type5])
    db.session.commit()

    return "添加图书分类"


@app.route("/query")
def query():
    # 返回所有
    # queryset = Type.query.all()
    # print(queryset, type(queryset))  # 返回是一个列表，元素是一个Type实例
    #
    # # 返回第一个
    # type1 = Type.query.first()
    #
    # # 以主键查询 返回  get(主键值)
    # type1 = Type.query.get(1)
    # type1 = Type.query.get_or_404(4)
    # print(type1, type(type1))  # 返回的是一个Type实例
    #
    # # 统计结果
    # count = Type.query.count()
    # print("结果个数:{}".format(count))

    # 条件查询
    type = Type.query.filter_by(name="玄幻小说", id=3).first()
    type = Type.query.filter(or_(Type.name == "修仙小说", Type.id == 6)).all()  # 写的 表达式
    type = Type.query.filter(not_(Type.name == "修仙小说")).all()  # 写的 表达式

    # 模糊查询  like
    type = Type.query.filter(Type.name.like("%小说")).all()
    type = Type.query.filter(Type.name.like("%仙%")).all()

    # limit 限制 最多示几个
    type = Type.query.offset(1).limit(3).all()

    print(type)
    return "查询练习"


@app.route("/update/<int:id>")
def update(id):
    type = Type.query.get(id)
    type.name = type.name + "1"
    db.session.commit()
    return "修改成功"


@app.route("/delete/<int:id>")
def delete(id):
    type = Type.query.get(id)
    db.session.delete(type)
    db.session.commit()
    return "删除成功"


if __name__ == '__main__':
    app.run()
